// Copyright 2006 Bret Taylor
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.

#ifndef INDIE_VISITOR_H__
#define INDIE_VISITOR_H__

#include "ast.h"

namespace indie {

class Visitor {
  public:
    virtual ~Visitor();

    virtual void Enter(const AstClassType& ast);
    virtual void Enter(const AstArrayType& ast);
    virtual void Enter(const AstUnionType& ast);
    virtual void Enter(const AstVariable& ast);
    virtual void Enter(const AstMethod& ast);
    virtual void Enter(const AstClass& ast);
    virtual void Enter(const AstFile& ast);
    virtual void Enter(const AstBlockStatement& ast);
    virtual void Enter(const AstExpressionStatement& ast);
    virtual void Enter(const AstAssignment& ast);
    virtual void Enter(const AstVariableDeclaration& ast);
    virtual void Enter(const AstEmptyStatement& ast);
    virtual void Enter(const AstIf& ast);
    virtual void Enter(const AstWhile& ast);
    virtual void Enter(const AstFor& ast);
    virtual void Enter(const AstBreak& ast);
    virtual void Enter(const AstReturn& ast);
    virtual void Enter(const AstParenthesizedExpression& ast);
    virtual void Enter(const AstAccess& ast);
    virtual void Enter(const AstArrayAccess& ast);
    virtual void Enter(const AstBinaryExpression& ast);
    virtual void Enter(const AstUnaryExpression& ast);
    virtual void Enter(const AstCall& ast);
    virtual void Enter(const AstNewInstance& ast);
    virtual void Enter(const AstNewArray& ast);
    virtual void Enter(const AstTypeTest& ast);
    virtual void Enter(const AstThis& ast);
    virtual void Enter(const AstIntegerConstant& ast);
    virtual void Enter(const AstStringConstant& ast);
    virtual void Enter(const AstFloatConstant& ast);
    virtual void Enter(const AstBooleanConstant& ast);

    virtual void Leave(const AstClassType& ast);
    virtual void Leave(const AstArrayType& ast);
    virtual void Leave(const AstUnionType& ast);
    virtual void Leave(const AstVariable& ast);
    virtual void Leave(const AstMethod& ast);
    virtual void Leave(const AstClass& ast);
    virtual void Leave(const AstFile& ast);
    virtual void Leave(const AstBlockStatement& ast);
    virtual void Leave(const AstExpressionStatement& ast);
    virtual void Leave(const AstAssignment& ast);
    virtual void Leave(const AstVariableDeclaration& ast);
    virtual void Leave(const AstEmptyStatement& ast);
    virtual void Leave(const AstIf& ast);
    virtual void Leave(const AstWhile& ast);
    virtual void Leave(const AstFor& ast);
    virtual void Leave(const AstBreak& ast);
    virtual void Leave(const AstReturn& ast);
    virtual void Leave(const AstParenthesizedExpression& ast);
    virtual void Leave(const AstAccess& ast);
    virtual void Leave(const AstArrayAccess& ast);
    virtual void Leave(const AstBinaryExpression& ast);
    virtual void Leave(const AstUnaryExpression& ast);
    virtual void Leave(const AstCall& ast);
    virtual void Leave(const AstNewInstance& ast);
    virtual void Leave(const AstNewArray& ast);
    virtual void Leave(const AstTypeTest& ast);
    virtual void Leave(const AstThis& ast);
    virtual void Leave(const AstIntegerConstant& ast);
    virtual void Leave(const AstStringConstant& ast);
    virtual void Leave(const AstFloatConstant& ast);
    virtual void Leave(const AstBooleanConstant& ast);

  protected:
    Visitor();

    virtual void EnterDefault(const Ast& ast);
    virtual void LeaveDefault(const Ast& ast);
};

} // namespace indie

#endif // INDIE_VISITOR_H__
